﻿#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//
//int main()
//{
//	int a = 20;
//	int* pa = &a;
//	return 0;
//}

//#include <stdio.h>
//
//#include <stdio.h>
//
//int main() {
//	int num = 10;//a的地址：00BEF97C
//	char *pn1 = (char*)&num; // 将 int 类型的指针 pn1 转换为 char 类型的指针，指向了 num。
//	int *pn2 = &num; // int 类型的指针 pn2 指向了 num。
//
//	//打印 num 变量的地址。所以这里打印00BEF97C
//	printf("%p\n", &num);
//
//	// 打印 pn1，即 char 类型的指针，存放的是 num 的地址。所以这里打印00BEF97C
//	printf("%p\n", pn1); 
//
//	// 打印 pn1 进行指针算术后的地址，由于pn1是char类型的指针，加1跳过一个字符的大小，也就是一个字节。所以这里打印00BEF97D
//	printf("%p\n", pn1 + 1); 
//
//	// 打印 pn2，即 int 类型的指针，存放的是 num 的地址。所以这里打印00BEF97C
//	printf("%p\n", pn2); 
//
//	// 打印 pn2 进行指针算术后的地址，由于pn2是int类型的指针，加1跳过一个整型的大小，也就是四个个字节。所以这里打印00BEF980
//	printf("%p\n", pn2 + 1); 
//
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int num = 0x11223344;
//	char *pn1 = (char *)&num;
//	int *pn2 = &num;
//	*pn1 = 0;
//	*pn2 = 0;
//	return 0;
//}
//#include <stdio.h>
//#include <stdlib.h>
//
//int main()
//{
//	int *ptr = (int *)malloc(sizeof(int)); // 分配动态内存
//	*ptr = 10;
//
//	free(ptr); // 释放内存
//	printf("%d\n", *ptr); // 访问 ptr 所指向的内存
//
//	return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5 };
//	printf("%d\n", (arr + 5) - arr);
//}
//#include <stdio.h>
//#include <assert.h>
//
//int my_strlen(const char* str)
//{
//	assert(str);
//	char* move = str;
//	while (*move)
//	{
//		move++;
//	}
//	return move - str;
//}
//int main()
//{
//	char* str = "Hello CSDN!";
//
//	printf("%d\n", my_strlen(str));
//	return 0;
//}
 
//#include <stdio.h>
//
//int main()
//{
//	const char*  str1 = "Hello_CSDN!";
//	const char*  str2 = "Hello_CSDN!";
//
//	if (str1 == str2) {
//		printf("str1 and str2 point to the same address.\n");
//	}
//	else {
//		printf("str1 and str2 do not point to the same address.\n");
//	}
//}
//#include <stdio.h>
//
//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5 };
//	printf("arr     == %p\n", arr);
//	printf("&arr[0] == %p\n", &arr[0]);
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
//	int *p = arr; //指针存放数组首元素的地址
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p + i);
//	}
//	return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//	int value = 10;
//	int *pv = &value; // 一级指针，指向整数
//	int **ppv = &pv; // 二级指针，指向指针变量 pv
//}

//#include <stdio.h>
//
//int main()
//{
//	const char* str = "Hello_CSDN";
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";
//	const char *str3 = "hello bit.";
//	const char *str4 = "hello bit.";
//	if (str1 == str2)
//	{
//		printf("str1 and str2 are same\n");
//	}
//	else
//	{
//		printf("str1 and str2 are not same\n");
//	}
//
//	if (str3 == str4)
//	{
//		printf("str3 and str4 are same\n");
//	}
//	else
//	{
//		printf("str3 and str4 are not same\n");
//	}
//
//	return 0;
//}
//#include <stdio.h>
//#include <stdlib.h>
//
//int main()
//{
//	int* arr[3]; // 指针数组，每个元素指向一行的整数数组
//
//	// 分配内存并初始化每行的长度
//	for (int i = 0; i < 3; ++i)
//	{
//		arr[i] = (int*)malloc(sizeof(int)* 3);//每行3个元素
//	}
//
//	// 初始化二维数组的值
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			*(*(arr + i) + j) = 0; // *(*(arr + i) + j) 给每个元素赋值
//		}
//	}
//
//	// 访问和打印二维数组的值
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			printf("%d ", *(*(arr + i) + j));//arr[i][j] == *(*(arr + i) + j)
//		}
//		printf("\n");
//	}
//
//	// 释放内存
//	for (int i = 0; i < 3; i++)
//	{
//		free(arr[i]);
//		arr[i] = NULL;
//	}
//
//	return 0;
//}

#include <stdio.h>

//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5 };
//	printf("arr = %p\n", arr);      
//	printf("&arr= %p\n", &arr);      
//	printf("arr+1 = %p\n", arr + 1);  
//	printf("&arr+1= %p\n", &arr + 1);  
//	return 0;
//}

//void processArray(int arr[], int size)
//{
//	int sz = sizeof(arr);
//	//在函数中使用 arr 指针，size 表示数组的大小
//	for (int i = 0; i < size; i++)
//	{
//		// 处理数组元素
//	}
//}
//
//int main() {
//	int arr[] = { 1, 2, 3, 4, 5 };
//	int size = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
//	processArray(arr, size); // 将数组 arr 和 数组大小传递给函数
//	return 0;
//}

//#include <stdio.h>
//void menu()
//{
//	printf("**************************\n");
//	printf("****  1. Add  2. Sub  ****\n");
//	printf("****  3. Mul  4. Div  ****\n");
//	printf("****      0. exit     ****\n");
//	printf("**************************\n");
//}
//
//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int(*cal[5])(int, int) = { NULL, Add, Sub, Mul, Div };
//
//	do
//	{
//		menu();//打印菜单
//		printf("请输入你的选择:");
//		scanf("%d", &input);
//		if (input >= 1 && input <= 4)
//		{
//			printf("请输入两个操作数:");
//			scanf("%d%d", &x, &y);
//			int ret = cal[input](x, y);
//			printf("ret == %d\n", ret);
//		}
//		else
//		{
//			printf("选择错误，请重新输入\n");
//		}
//		
//	} while (input);
//	return 0;
//}

#include <stdio.h>

//用户自定义的比较函数
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
//打印数组内容
void Print(int* arr, int sz)
{
	for (int i = 0; i < sz; ++i)
	{
		printf("%d ", arr[i]);
	}

	printf("\n");
}
//交换两个数据
void swap(char* e1, char* e2, size_t size)
{
	for (size_t i = 0; i < size; ++i)
	{
		char tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}

//冒泡排序排任意类型的数据
void bubble_sort(void* base, size_t num, size_t size, int(*cmp)(const void*, const void*))
{
	//排序趟数
	for (size_t i = 0; i < num - 1; ++i)
	{
		//每一趟排序比较的趟数
		for (size_t j = 0; j < num - 1 - i; ++j)
		{
			//通过函数指针调用比较函数进行比较.
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				//交换两个数据
				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

int main()
{
	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	size_t sz = sizeof(arr) / sizeof(int);

	printf("排序前:");
	Print(arr, sz);

	bubble_sort(arr, sz, sizeof(int), cmp_int);

	printf("排序后:");
	Print(arr, sz);

	return 0;
}


//int main()
//{
//	//10 9 8 7 6
//	//5  4 3 2 1
//	int aa[2][5] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
//	int *ptr1 = (int *)(&aa + 1);//1
//	int *ptr2 = (int *)(*(aa + 1));//6
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//	return 0;
//}

//int main()
//{
//	int a[5] = { 5, 4, 3, 2, 1 };
//	int *ptr = (int *)(&a + 1);
//	printf("%d,%d", *(a + 1), *(ptr - 1));//     1
//	return 0;
//}